
#ifndef _BONUS_H_
#define _BONUS_H_

#include "Heros.h"
#include "Ennemi.h"
#include "Boss.h"


/** @brief File brief description
 * Le fichier Bonus.h contient la declaration de toutes les fonctions et procedures necessaires
 * a la gestion individuelle d'un bonus.Cela comprend la creation du bonus a la position d'un ennemi detruit,
 * la gestion de son type (bonus arme ou vie), sa destruction lorsque le heros le ramasse ainsi que la gestion
 * de ses effets sur le heros*/


/** @brief La structure Bonus comporte un entier qui permet de differencier les bonus
 * d'arme des bonus de vie (2 represente un bonus d'arme (onde de choc), 1 represente un bonus d'arme (missile),
 * 0 un bonus de vie) , 
 * une abscisse et une ordonnee (2 reels)*/
typedef struct
{
	int est_bonus_arme;
	float posX_bonus;
	float posY_bonus;
} Bonus;

/** @brief Cette procedure initialise un bonus en le placant a la position d'un ennemi detruit et
 * en definissant le type de bonus (vie ou arme)
 * @param [in,out] pbonus
 * @param [in,out] pennemi
   @return none*/
void initBonus (Bonus* pbonus, Ennemi* pennemi);

/** @brief Cette fonction  reserve dans le tas l'espace necessaire pour un bonus,
 * l'initialise et retourne un pointeur sur le bonus créé
 * @param [in,out] pennemi
   @return Bonus* pbonus */
Bonus* creerBonus (Ennemi* pennemi);

/** @brief Cette procedure initialise le bonus final en le placant a la position du boss
 * @param [in,out] pbonus
 * @param [in,out] pboss
   @return none*/
void initBonusBoss (Bonus* pbonus, Boss* pboss);

/** @brief Cette fonction  reserve dans le tas l'espace necessaire pour un bonus,
 * l'initialise et retourne un pointeur sur le bonus créé
 * @param [in,out] pboss
   @return Bonus* pbonus*/
Bonus* creerBonusBoss (Boss* pboss);

/** @brief Cette procedure libere l'espace memoire alloue dans le tas pour un bonus
 * @param [in,out] ppbonus
   @return none*/
void detruireBonus (Bonus** ppbonus);

/** @brief Cette fonction retourne un entier correspondant au type du bonus passe en parametre 
 * @param [in] pbonus
   @return pbonus->est_bonus_arme*/
const int getEstBonusArme (const Bonus* pbonus);

/** @brief Cette procedure permet de changer le type d'un bonus passe en parametre en fournissant
 * une nouvelle valeur en donnee
 * @param [in,out] pbonus
 * @param [in] est_bonus
   @return none*/
void setEstBonusArme (Bonus* pbonus, const int est_bonus);

/** @brief Cette fonction retourne l'abscisse du bonus passe en parametre 
 * @param [in] pbonus
   @return pbonus->posX_bonus*/
const float getPosXBonus (const Bonus* pbonus);

/** @brief Cette procedure permet de changer l'abscisse du bonus passe en parametre en fournissant
 * une nouvelle valeur en donnee
 * @param [in,out] pbonus
 * @param [in] posX_bonus
   @return none*/
void setPosXBonus (Bonus* pbonus, const float posX_bonus);

/** @brief Cette fonction retourne l'ordonnee du bonus passe en parametre 
 * @param [in] pbonus
   @return pbonus->posY_bonus*/
const float getPosYBonus (const Bonus* pbonus);

/** @brief Cette procedure permet de changer l'ordonnee du bonus passe en parametre en fournissant
 * une nouvelle valeur en donnee
 * @param [in,out] pbonus
 * @param [in] posY_bonus
   @return none*/
void setPosYBonus (Bonus* pbonus, const float posY_bonus);



/** @brief Cette procedure permet au heros de beneficier des effets d'un bonus lorsque il en
 * ramasse un
 * @param [in,out] pheros
 * @param [in] pbonus
   @return none*/
void bonusHeros (Heros* pheros,const Bonus* pbonus);

#endif
